package com.chats.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chats.common.Result;
import com.chats.mapper.UserMapper;
import com.chats.pojo.User;
import com.chats.service.UserService;
import com.chats.util.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 用户登录
     * @param user
     * @return
     */
    @Override
    public Result login(User user) {
        // 从用户对象中提取用户名和密码
        String username = user.getUsername();
        String password = user.getPassword();

        // 使用MD5加密密码
        String encryptedPassword = encryptPassword(password);

        // 通过用户名从数据库中检索用户
        User userDB = getUserByUsername(username);

        // 如果未找到用户，返回错误信息
        if (userDB == null) {
            log.info("未找到用户名为：{} 的用户", username);
            return Result.error("登录失败，请检查用户名或密码是否有误");
        }

        // 验证密码是否正确
        if (!isPasswordValid(encryptedPassword, userDB.getPassword())) {
            log.info("用户名为：{} 的用户密码错误", username);
            return Result.error("登录失败，请检查用户名或密码是否有误");
        }

        // 登录成功：生成并返回令牌
        return createLoginSuccessResult(userDB);
    }

    // 使用MD5加密密码
    private String encryptPassword(String password) {
        return DigestUtils.md5DigestAsHex(password.getBytes());
    }

    // 通过用户名检索用户
    private User getUserByUsername(String username) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, username);
        return this.getOne(queryWrapper);
    }

    // 检查提供的密码是否正确
    private boolean isPasswordValid(String encryptedPassword, String storedPassword) {
        return encryptedPassword.equals(storedPassword);
    }

    // 创建登录成功的结果
    private Result createLoginSuccessResult(User userDB) {
        log.info("登录成功，用户ID：{}", userDB.getId());

        Map<String, Object> claims = new HashMap<>();
        claims.put("id", userDB.getId());
        String token = JwtUtils.generateJwt(claims);

        // 确保在响应中不暴露密码
        userDB.setPassword(null);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("token", token);
        jsonObject.put("user", userDB);

        return Result.success(jsonObject);
    }

    /**
     * 用户注册
     * @param user
     */
    @Override
    public Result register(User user) {
        String username = user.getUsername();
        String password = user.getPassword();

        // 将页面提交的密码password进行md5加密处理
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        // 根据用户名查询用户
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, username);
        User userDB = this.getOne(queryWrapper);
        if(userDB != null) { // 用户名已存在
            log.info("用户名已存在 username={}", username);
            return Result.error("用户名已存在");
        }

        // 保存至数据库
        user.setPassword(password);
        this.save(user);
        user.setPassword(null);

        return Result.success();
    }


}
